﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace EMoney.IStock.Client.Framework
{
    public class MD5Hash
    {
        public static string GetMD5Key(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        public static string GetMD5Key(byte[] data)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            data = md5Hasher.ComputeHash(data);

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        public static string GetMD5Key(object obj)
        {
            if (obj == null)
            {
                return "v2.0";
            }
            string a = obj.GetType().Name;
            if (a.ToLower() == "string")
            {
                a = a + obj;
            }
            else
            {
                a = GetObjStr(obj, a);
            }
            return MD5Hash.GetMD5Key(a);
        }

        private static string GetObjStr(object obj, string a)
        {
            var ps = obj.GetType().GetProperties();
            foreach (var p in ps)
            {
                var pname = p.Name;
                a += pname;
                var pvalue = p.GetValue(obj, null);
                if (pvalue != null)
                {
                    if (pvalue.GetType().IsArray)
                    {
                        var ps1 = pvalue as Array;
                        foreach (var p1 in ps1)
                        {
                            a += p1.ToString();
                        }
                    }
                    a += pvalue.ToString();
                }
            }
            return a;
        }
    }
}
